home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
176-200
/
scopedisk185
/
calc
/
calcgadgets.mod
< prev
next >
Wrap
Text File
|
1995-03-19
|
8KB
|
320 lines
IMPLEMENTATION MODULE CalcGadgets;
FROM SYSTEM IMPORT ADR, ADDRESS, BYTE, SHIFT, TERMPROC;
FROM Intuition IMPORT AddGList, RefreshGList, ActivationFlagSet,
ActivationFlags, GadgetFlags, GadgetFlagSet,
GadgetPtr, IntuiMessage, RemoveGList;
FROM Pens IMPORT SetAPen, SetDrMd, RectFill;
FROM Rasters IMPORT RastPortPtr, DrawingModeSet, Complement, Jam1;
FROM DOSProcess IMPORT Delay;
FROM EasyGadgets IMPORT StartList, DisposeList, currentList, AddDropShadow,
listFailed, AddBoolGadget, nextBoolActivation,
AddBorders, nextBorderFrontPen, currentIntui,
currentGadget, nextFlags, nextIntuiTopEdge,
nextIntuiLeftEdge, nextIntuiFrontPen,
nextIntuiTextAttr;
FROM CalcMenus IMPORT wordSize, WSize, signed;
FROM CalcDisplay IMPORT DoLCD, window, textAttr;
FROM CalcBrains IMPORT EnterOperation, OpType, value, stoValue;
FROM CalcValidate IMPORT Addition, Multiplication, Subtraction;
VAR
gadgets : ARRAY [B0..ClearEntry] OF GadgetPtr;
PROCEDURE InverseGadget(gad:GadgetPtr);
VAR
rp : RastPortPtr;
olddrmd : DrawingModeSet;
BEGIN
rp:=window^.RPort;
olddrmd:=rp^.DrawMode;
SetDrMd(rp,Complement);
RectFill(rp,gad^.LeftEdge,gad^.TopEdge,
gad^.LeftEdge+gad^.Width-1,gad^.TopEdge+gad^.Height-1);
SetDrMd(rp,olddrmd);
END InverseGadget;
PROCEDURE FlashGadget(gad:GadgetPtr);
BEGIN
InverseGadget(gad);
Delay(4);
InverseGadget(gad);
END FlashGadget;
PROCEDURE TerminateCalcGadgets;
BEGIN
DisposeList(currentList);
END TerminateCalcGadgets;
PROCEDURE InitGadgetStuff(): BOOLEAN;
VAR
width : CARDINAL;
counter : GadgetType;
dummy : INTEGER;
(*$S-*)
PROCEDURE AddGad(left,top:INTEGER; name:ARRAY OF CHAR);
BEGIN
AddBoolGadget(left,top,width,9,name);
gadgets[counter]:=currentGadget;
INC(counter);
IF HIGH(name)=0 THEN
INC(currentIntui^.LeftEdge,8);
ELSIF HIGH(name)=1 THEN
INC(currentIntui^.LeftEdge,4);
END;
AddBorders();
AddDropShadow();
END AddGad;
BEGIN
StartList;
nextBoolActivation:=ActivationFlagSet{RelVerify};
DEC(nextIntuiTopEdge,2);
DEC(nextIntuiLeftEdge,4);
nextIntuiFrontPen:=0;
nextIntuiTextAttr:=ADR(textAttr);
counter:=B0;
width:=60;
nextBorderFrontPen:=0;
AddGad(18,104,"0");
INC(currentIntui^.LeftEdge,16);
width:=26;
AddGad(18,90,"1");
AddGad(53,90,"2");
AddGad(88,90,"3");
AddGad(18,76,"4");
AddGad(53,76,"5");
AddGad(88,76,"6");
AddGad(18,62,"7");
AddGad(53,62,"8");
AddGad(88,62,"9");
AddGad(18,48,"A");
AddGad(53,48,"B");
AddGad(88,48,"C");
AddGad(18,34,"D");
AddGad(53,34,"E");
AddGad(88,34,"F");
AddGad(127,62,"(");
AddGad(162,62,")");
AddGad(88,104,"+/-");
width:=60;
nextBorderFrontPen:=2;
AddGad(127,104,"=");
INC(currentIntui^.LeftEdge,16);
width:=26;
AddGad(127,76,"+");
AddGad(162,76,"-");
AddGad(127,90,"*");
AddGad(162,90,"/");
INCL(nextBoolActivation,GadgImmediate);
EXCL(nextBoolActivation,RelVerify);
AddGad(201,90,"BIN");
AddGad(236,90,"OCT");
AddGad(201,104,"DEC");
AddGad(236,104,"HEX");
EXCL(nextBoolActivation,GadgImmediate);
INCL(nextBoolActivation,RelVerify);
AddGad(201,76,"STO");
AddGad(236,76,"RCL");
AddGad(201,62,"«SH");
AddGad(236,62,"SH»");
AddGad(201,48,"«RO");
AddGad(236,48,"RO»");
AddGad(201,34,"«AS");
AddGad(236,34,"AS»");
AddGad(127,48,"NOT");
AddGad(127,34,"AND");
AddGad(162,34,"OR");
AddGad(162,48,"XOR");
nextBorderFrontPen:=3;
AddGad(201,17,"CA");
AddGad(236,17,"CE");
IF NOT listFailed THEN
dummy:=AddGList(window,currentList,0,-1,NIL);
RefreshGList(currentList,window,NIL,-1);
InverseGadget(gadgets[VAL(GadgetType,ORD(Bin)+ORD(base))]);
GhostUnused;
END;
TERMPROC(TerminateCalcGadgets);
RETURN NOT listFailed;
END InitGadgetStuff;
PROCEDURE DoGadget(gadget:GadgetType): INTEGER;
VAR
numBase : LONGCARD;
maxBit : CARDINAL;
bit : BOOLEAN;
backup : LONGCARD;
BEGIN
CASE base OF
|BINA: numBase:=2;
|OCTA: numBase:=8;
|DECI: numBase:=10;
|HEXA: numBase:=16;
ELSE
END;
CASE wordSize OF
|WORD8 : maxBit:=7;
|WORD16: maxBit:=15;
|WORD32: maxBit:=31;
ELSE
END;
IF resetValue & (gadget>=B0) & (gadget<=BF) THEN
value:=0;
resetValue:=FALSE;
END;
CASE gadget OF
|B0..BF : IF Multiplication(value,numBase) THEN
backup:=value;
IF (signed) & (LONGINT(value)<0) THEN
value:=LONGINT(value)*LONGINT(numBase);
IF Subtraction(value,LONGINT(ORD(gadget)-ORD(B0))) THEN
value:=LONGINT(value)-LONGINT(ORD(gadget)-ORD(B0));
ELSE
value:=backup;
END;
ELSE
value:=value*numBase;
IF Addition(value,LONGCARD(ORD(gadget)-ORD(B0))) THEN
value:=value+LONGCARD(ORD(gadget)-ORD(B0));
ELSE
value:=backup;
END;
END;
END;
|SignInvert : value:=LONGCARD(-LONGINT(value));
|Sto : stoValue:=value;
|Rcl : value:=stoValue;
|ShiftLeft : value:=SHIFT(value,1);
|ShiftRight : value:=SHIFT(value,-1);
|RotateLeft : bit:= (maxBit IN LONGBITSET(value));
value:=SHIFT(value,1);
IF bit THEN
INC(value);
END;
|RotateRight: bit:= (0 IN LONGBITSET(value));
value:=SHIFT(value,-1);
IF bit THEN
INC(value,LONGCARD(LONGBITSET{maxBit}));
END;;
|AShiftLeft : ;
|AShiftRight: ;
|Not : value:=LONGCARD(LONGBITSET{0..31}-LONGBITSET(value));
|ClearEntry : value:=0;
|Bin..Hex : InverseGadget(gadgets[VAL(GadgetType,ORD(Bin)+ORD(base))]);
base:=VAL(Base,ORD(gadget)-ORD(Bin));
InverseGadget(gadgets[gadget]);
GhostUnused;
|LeftParen : EnterOperation(OpLeftParen);
|RightParen : EnterOperation(OpRightParen);
|Equal : EnterOperation(OpEqual);
|Plus : EnterOperation(OpPlus);
|Minus : EnterOperation(OpMinus);
|Times : EnterOperation(OpTimes);
|Divide : EnterOperation(OpDivide);
|And : EnterOperation(OpAnd);
|Or : EnterOperation(OpOr);
|Xor : EnterOperation(OpXor);
|ClearAll : value:=0;
EnterOperation(OpClearAll);
ELSE
END;
DoLCD;
RETURN 0;
END DoGadget;
PROCEDURE HandleGadget(VAR intui:IntuiMessage; gadget:GadgetPtr): INTEGER;
BEGIN
RETURN DoGadget(VAL(GadgetType,gadget^.GadgetID));
END HandleGadget;
PROCEDURE FakeGadget(gadget:GadgetType): INTEGER;
BEGIN
IF (gadget<Bin) OR (gadget>Hex) THEN
FlashGadget(gadgets[gadget]);
END;
RETURN DoGadget(gadget);
END FakeGadget;
PROCEDURE GhostUnused;
VAR
gad : GadgetPtr;
count : CARDINAL;
pos : INTEGER;
BEGIN
pos:=RemoveGList(window,gadgets[B0],16);
gad:=gadgets[B0];
count:=16;
REPEAT
EXCL(gad^.Flags,GadgDisabled);
gad:=gad^.NextGadget;
DEC(count);
UNTIL count=0;
CASE base OF
|BINA: gad:=gadgets[B2];
count:=14;
|OCTA: gad:=gadgets[B8];
count:=8;
|DECI: gad:=gadgets[BA];
count:=6;
|HEXA: count:=0;
END;
WHILE count>0 DO
INCL(gad^.Flags,GadgDisabled);
gad:=gad^.NextGadget;
DEC(count);
END;
pos:=AddGList(window,gadgets[B0],pos,16,NIL);
RefreshGList(gadgets[B0],window,NIL,16);
pos:=RemoveGList(window,gadgets[SignInvert],1);
INCL(gadgets[SignInvert]^.Flags,GadgDisabled);
IF signed THEN
EXCL(gadgets[SignInvert]^.Flags,GadgDisabled);
END;
pos:=AddGList(window,gadgets[SignInvert],pos,1,NIL);
RefreshGList(gadgets[SignInvert],window,NIL,1);
END GhostUnused;
BEGIN
base:=DECI;
END CalcGadgets.